import { playStartupSound } from '@/utils/audioGenerator';
import { playSound, preloadAllSounds, type SoundType } from '@/utils/audioLoader';

/**
 * 音效管理服务
 * 负责管理应用的所有音效播放
 */
class AudioService {
  private isEnabled: boolean = true;
  private volume: number = 0.3;
  private usePreloadedSounds: boolean = true;

  /**
   * 初始化音效服务
   */
  async initialize(): Promise<void> {
    try {
      if (this.usePreloadedSounds) {
        await preloadAllSounds();
        console.log('音效服务初始化完成 - 使用预生成音效');
      } else {
        console.log('音效服务初始化完成 - 使用程序生成音效');
      }
    } catch (error) {
      console.warn('预加载音效失败，将使用程序生成音效:', error);
      this.usePreloadedSounds = false;
    }
  }

  /**
   * 设置音效是否启用
   */
  setEnabled(enabled: boolean): void {
    this.isEnabled = enabled;
    console.log('音效状态已更新:', enabled ? '启用' : '禁用');
  }

  /**
   * 获取音效启用状态
   */
  getEnabled(): boolean {
    return this.isEnabled;
  }

  /**
   * 设置音效音量
   */
  setVolume(volume: number): void {
    this.volume = Math.max(0, Math.min(1, volume)); // 确保音量在0-1之间
    console.log('音效音量已设置为:', this.volume);
  }

  /**
   * 获取音效音量
   */
  getVolume(): number {
    return this.volume;
  }

  /**
   * 播放音效的通用方法
   */
  private async playAudioEffect(soundType: SoundType, fallbackFn?: () => Promise<void>): Promise<void> {
    if (!this.isEnabled) {
      console.log(`音效已禁用，跳过播放${soundType}音效`);
      return;
    }

    try {
      if (this.usePreloadedSounds) {
        console.log(`播放预生成音效: ${soundType}`);
        await playSound(soundType, this.volume);
      } else if (fallbackFn) {
        console.log(`播放程序生成音效: ${soundType}`);
        await fallbackFn();
      }
    } catch (error) {
      console.error(`播放${soundType}音效失败:`, error);

      // 如果预生成音效失败，尝试使用后备方案
      if (this.usePreloadedSounds && fallbackFn) {
        try {
          console.log(`预生成音效失败，使用程序生成音效: ${soundType}`);
          await fallbackFn();
        } catch (fallbackError) {
          console.error(`后备音效也失败:`, fallbackError);
        }
      }
    }
  }

  /**
   * 播放启动音效
   */
  async playStartup(): Promise<void> {
    await this.playAudioEffect('startup', async () => {
      await playStartupSound(this.volume);
    });
  }

  /**
   * 播放成功音效
   */
  async playSuccess(): Promise<void> {
    await this.playAudioEffect('success');
  }

  /**
   * 播放错误音效
   */
  async playError(): Promise<void> {
    await this.playAudioEffect('error');
  }

  /**
   * 播放通知音效
   */
  async playNotification(): Promise<void> {
    await this.playAudioEffect('notification');
  }

  /**
   * 设置是否使用预生成音效
   */
  setUsePreloadedSounds(use: boolean): void {
    this.usePreloadedSounds = use;
    console.log('音效模式已切换为:', use ? '预生成音效' : '程序生成音效');
  }

  /**
   * 获取是否使用预生成音效
   */
  getUsePreloadedSounds(): boolean {
    return this.usePreloadedSounds;
  }
}

// 创建单例实例
export const audioService = new AudioService();

// 默认导出
export default audioService;
